A Capacidade de Computação (CC) atua como a ponte de versão entre arquitetura virtual (PTX) e arquitetura real (SASS/ binário). Os desenvolvedores usam nvcc para direcionar plataformas específicas, variando desde plataformas desktop/servidor até plataformas embarcadas, em modelos de sistema operacional como Linux 64-bit (LP64) ou Windows 64-bit (LLP64).
1. Arquiteturas Virtuais versus Reais
A ferramenta CUDA suporta arquiteturas de GPU das duas últimas versões principais, referenciadas em Tabela 29: Suporte a Funcionalidades em Capacidades de Computação (7.5 a 12.x). Definimos mapeamentos usando flags como: nvcc --generate-code arch=compute_80,code=sm_90 prog.cu. Para alvos voltados para o futuro, flags como nvcc -arch=sm_100 ou variantes especializadas como nvcc -arch=sm_100a são usadas.
2. A Hierarquia de Macros
O compilador usa __CUDA_ARCH__ para ramificar código. A macro __CUDA_ARCH__ é definida apenas em código de dispositivo (por exemplo, __device__, __global__). Um controle mais granular é fornecido por __CUDA_ARCH_SPECIFIC__ e __CUDA_ARCH_FAMILY_SPECIFIC__. Algumas funcionalidades, como Memória Compartilhada Distribuída ou payloads específicos NaN, exigem Capacidade de Computação 9.0+ ou Capacidade de Computação 10.0 e posteriores.
3. Limites e Restrições Numéricos
A precisão varia conforme a CC; por exemplo, o tratamento de subnormais garante $2^{-16382} \approx 3.36 \cdot 10^{-4932}$. Limites de hardware como CUDA_DEVICE_MAX_COPY_CONNECTIONS=16 ou a diretiva .maxnreg da diretiva PTX são estritamente aplicados com base na versão de CC alvo.